package com.own.component.store.core;

import com.own.component.store.core.method.*;
import org.springframework.stereotype.Component;

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Store
 *
 * @author chenxueli
 * @date 2022-06-15 03:14:15
 */
@Component
public interface Store<T> {

    /**
     * 获取Value操作对象
     *
     * @return value操作对象
     */
    StoreValue<T> value();

    /**
     * 获取Map操作对象
     *
     * @return map操作对象
     */
    StoreMap<T> map();

    /**
     * 获取Set操作对象
     *
     * @return set操作兑现
     */
    StoreSet<T> set();

    /**
     * 获取List操作对象
     *
     * @return list操作对象
     */
    StoreList<T> list();

    /**
     * 获取Atom操作对象
     *
     * @return atom操作对象
     */
    StoreAtomic atomic();

    /**
     * 是否存在
     *
     * @param name name
     * @return 是否存在
     */
    boolean contains(String name);

    /**
     * 获取所有的key
     *
     * @return key
     */
    default Set<String> keys() {
        return Stream.of(
                        value().keySet(),
                        map().keySet(),
                        set().keySet(),
                        list().keySet(),
                        atomic().keySet()
                )
                .flatMap(Set::stream)
                .collect(Collectors.toSet());
    }

}
